面向CPU
位图(点阵图像/像素图) 有一个个像素所组成的图像,缩放会失真
简单的纹理格式
通常情况下256种状态的维度图像,不压缩的情况下,一个像素要8bit【1Byte】
- RGBA32(RGBA8888) 每个像素4字节,RGBA通道各占8位
- RGBA16(RGBA4444) 每个像素2字节,RGBA通道各占4位
- RGB24(RGB888) 每个像素3字节,RGB通道各占8位,无透明通道
- RGB16(RGB565) 每个像素2字节,RGBA通道各占5/6/5位,无透明通道
- RGBA16(RGBA5551) 每个像素2字节,RGB通道各占5位,透明通道占1位,要么完全透明要么完全不透明
决定纹理资源大小的因素
- 分辨率
- 格式
- Mipmap
图片文件
- 文件描述信息
- 图像数据区
图片文件格式
- png:无损的压缩图片形格式
- jgp/jpeg:有损的压缩图片形格式 根据自己的压缩算法,将图像压缩在很小的存储空间,图像中重复或者不重要的资料会被丢失
- gif
- psd ps:专用格式,会保存图层、通道、路径等信息,是没有经过压缩的
图像数据压缩方式
采用像素图压缩图像数据
一张纹理所占用的内存:1024pixel*1024pixel*4Byte = 4M
面向GPU
面向GPU的压缩算法
- PC
- DXT
- Android
- ETC/ETC2
- ASTC 4x4
- RGBA crunched ETC2【带有crunched都是有损压缩】
(纹理在CPU上被解压缩成ETC2格式,并在运行时加载到GPU上,虽然压缩时间较长,但是十分节省磁盘空间并且运行时解压速度很快)
- IOS
- PVR
当选择压缩算法的时候,如果GPU不支持此压缩格式,那么纹理就会被解压缩成RGB或者RGBA格式的,会增加解压时间并且占用更多内存
纹理压缩格式
DXT:适用于各种windows设备,是一种有损的压缩方式,基本思想就是把4x4的像素快压缩成一个64或者128位的数据块。
DXT1:主要适用于RGB565(不具透明度的贴图)或RGBA5551(仅具一位Alpha的贴图)*RGB565对比RGB888也是一种缺失,因为人眼对绿色最敏感,所以G占6位。
工作原理:将整张纹理图按照4x4像素分为一个个的块(每个块保留了2个16位的颜色),对保留的2个颜色进行插值得到另外2个颜色值,在4x4的像素块中,每一个像素颜色都对应这4个颜色之一,每个像素需要2bit。所以每个块用64位 = 4x4像素 x 2bit + 2个颜色 x 16位。这种压缩格式整体效果不错,但是如果对局部做特写的话会发现细节上有很多的丢失,是因为每个块只会保留两个颜色,所以当一个块中出现了两个以上的颜色的时候,那么有的颜色就丢失,这种细节丢失的情况通常发生在比较细的边界中,但是由于DXT1的压缩率是RGB的6倍,所以这种问题可以通过提高分辨率来解决。
DXT2/DXT3:在DXT1中的4x4像素块中附加了64位数据(2个8位的Alpha值 + 16个3位的索引值,每个像素索引占3位,表示8中不同透明状态)来表示Alpha透明信息
区别:DXT2完成了颜色和Alpha的混合,也就是当Alpha发生改变时,直接改变整体颜色值;DXT3的Alpha信息是相对独立的。
DXT4/DXT5:在DXT1中的4x4像素块中附加了64位数据来表示Alpha透明信息,这些透明信息是通过线性插值得来的。
区别:DXT4完成了颜色和Alpha的混合,也就是当Alpha发生改变时,直接改变整体颜色值;DXT5的Alpha信息是相对独立的。
ETC:是一种有损压缩算法,也是把4x4的像素块压缩成64或128位的数据块。
ETC1:不支持透明,对于透明纹理,在Android设备上,可以把RGB和A拆到2张ETC1纹理上,游戏中再合并使用。
ETC2:向后兼容ETC1,压缩质量更好而且支持透明通道。
ASTC:适用于IOS(A8)的苹果手机及使用PowerVR 6XT、Mali T600、Adreno 400series、Tegra K1 GPU的Android手机。
PVRTC:压缩比高,也是有损压缩,要求纹理的高和宽必须都是2的整数次幂,最小为8,适用于所有IOS设备和使用PowerVR GPU的Android设备上。
PVRTC -2bpp(bit per pixel):每个像素2位,质量较差
PVRTC -4bpp(bit per pixel):每个像素4位
图片在Unity如何被使用
当有一张图片进入到Assets时,Unity需要导入该图片
- 根据该图片的用途决定将其转换成什么东西?(Texture Type)
- 根据当前系统平台采用合适的(GPU)压缩算法
转换后的东西,会存在Library目录下,以meta文件中的guid开头,在apk包中找到这个东西
后续
- 渲染管线
- 颜色空间
- 线性
- Gamma
- HDR
- 在profiler中确定压缩前后的内存占用,RGBA32 - RGBA crunched ETC2 - RGBA crunched DXT5